package cn.hpclub.server.plugin;

import org.nutz.ssdb4j.spi.SSDB;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

/**
 * SsdbInterceptor 用于在同一线程中共享同一个 ssdb 对象，提升性能.
 * 目前只支持主缓存 mainCache，若想更多支持，参考此拦截器创建新的拦截器
 * 改一下Ssdb.use() 为 Ssdb.use(otherCache) 即可
 */

public class SsdbInterceptor implements Interceptor{

    /**
     * 通过继承 SsdbInterceptor 类并覆盖此方法，可以指定
     * 当前线程所使用的 cache
     */
    protected Cache getCache() {
        return Ssdb.use();
    }
    
    
    @Override
    public void intercept(Invocation inv){
        Cache cache = getCache();
        SSDB ssdb = cache.getThreadLocalSsdb();
        if (ssdb != null) {
            inv.invoke();
            return ;
        }
        
        try {
            ssdb = cache.ssdb;
            cache.setThreadLocalSsdb(ssdb);
            inv.invoke();
        }
        finally {
            cache.removeThreadLocalSsdb();
            //ssdb.close();
        }
    }

}
